//
//  CZRefreshControl.swift
//  czbkiosweibo5
//
//  Created by zhangping on 15/10/20.
//  Copyright © 2015年 zhangping. All rights reserved.
//

import UIKit

/// 自定义刷新控件
class CZRefreshControl: UIRefreshControl {
    
    // MARKK: - 属性
    /// 箭头旋转时的Y的值
    private let refreshControlOffest: CGFloat = -60
    
    /// 标示位,防止重复打印
    private var rotateFlag = false
    
    /// 覆盖父类的frame属性,实现didSet属性监视器
    override var frame: CGRect {
        didSet {
//            print("frame: \(frame)")
            // 当frame.origin.y 大于0直接返回
            if frame.origin.y > 0 {
                return
            }
            
            // 判断是否正在刷新
            if refreshing {
                // 开始刷新动画
                refreshView.startLoading()
            }
            
            // 发现每拖动一点点都会打印 箭头朝上 或 箭头朝下
            // 当frame.origin.y < -60 箭头朝上
            // 0 < frame.origin.y < -60 箭头朝下
            if frame.origin.y < refreshControlOffest && !rotateFlag {
//                print("箭头朝上")
                rotateFlag = true
                refreshView.rotateTipIcon(rotateFlag)
            } else if frame.origin.y > -refreshControlOffest && rotateFlag {
//                print("箭头朝下")
                rotateFlag = false
                refreshView.rotateTipIcon(rotateFlag)
            }
        }
    }
    
    // MARK: - 重写父类的方法
    override func endRefreshing() {
        super.endRefreshing()
        
        // 停止动画
        refreshView.stopLoading()
    }
    
    // MARK: - 构造函数
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override init() {
        super.init()
        
        prepareUI()
    }
    
    // MARK 准备UI
    private func prepareUI() {
        // 隐藏菊花
        tintColor = UIColor.clearColor()
        
        // 添加自定义控件
        addSubview(refreshView)
        print("refreshView: \(refreshView)")
        
        // 添加约束,中心对齐
        refreshView.ff_AlignInner(type: ff_AlignType.CenterCenter, referView: self, size: CGSize(width: refreshView.bounds.width, height: refreshView.bounds.height))
    }

    // MARK: - 懒加载控件
    private lazy var refreshView = CZRefreshView.refreshView()
}


class CZRefreshView: UIView {
    
    /// 箭头
    @IBOutlet weak var tipIcon: UIImageView!
    
    // 下拉刷新数据label和箭头的父控件
    @IBOutlet weak var tipView: UIView!
    
    // 加载视图
    @IBOutlet weak var loadingView: UIImageView!
    
    // 从xib加载自定义view, 从xib里面加载后view的尺寸已经确定
    class func refreshView() -> CZRefreshView {
        return NSBundle.mainBundle().loadNibNamed("CZRefreshView", owner: nil, options: nil).last as! CZRefreshView
    }
    
    /**
    箭头旋转动画
    - parameter rotationFlag: false 表示箭头朝下, true表示箭头朝上
    */
    func rotateTipIcon(rotationFlag: Bool) {
        UIView.animateWithDuration(0.25) { () -> Void in
            self.tipIcon.transform = rotationFlag ? CGAffineTransformMakeRotation(CGFloat(M_PI)) : CGAffineTransformIdentity
        }
    }
    
    // 每次拖动tableView,只要 refreshing = true 就会调用startLoading,导致动画重复添加
    /// 开始加载动画
    func startLoading() {
        let animKey = "animKey"
        // 判断动画是否正在执行,如果正在执行就不添加
        if let _ = loadingView.layer.animationForKey(animKey) {
            return
        }
        
        // 隐藏 tipView
        tipView.hidden = true
        
        // 创建动画
        let anim = CABasicAnimation(keyPath: "transform.rotation")
        anim.toValue = M_PI * 2
        anim.duration = 0.25
        anim.repeatCount = MAXFLOAT
        anim.removedOnCompletion = false
        
        // 开始动画
        loadingView.layer.addAnimation(anim, forKey: animKey)
    }
    
    /// 停止动画
    func stopLoading() {
        // 显示 下拉刷新 视图
        tipView.hidden = false
        
        // 停止旋转
        loadingView.layer.removeAllAnimations()
    }
}